home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / mus / edit / QuadraComp.lha / QuadraComposer / QCFastreplay.s < prev    next >
Text File  |  1993-03-16  |  23KB  |  1,154 lines

  1. * This replayroutine was written by Bo Lincoln (Eternal).
  2. * Copyright © 1993 Technological Artwork. All rights reserved.
  3. * You may use this routine in your programs.
  4. * This is the fast-routine, i.e it uses level 6 interrupt to wait for
  5. * the dma. Worst case is about 8 rasterlines (tested with an average module).
  6. * How to use: Call QC_init to init the mod.
  7. *             Call QC_music every vertical blank.
  8. *             Call QC_end to stop.
  9. *             The EMOD should be at QC_data.
  10. * You can not use Tempo in this routine. (Then you have to put the whole
  11. * routine in the level 6 interrupt, or use the CIA-replay)
  12.               
  13.  
  14. QC_dmawait = 255
  15.  
  16. cia_CRA = $e00
  17. cia_ICR = $d00
  18. cia_TALO = $400
  19. cia_TAHI = $500
  20.  
  21.     section QC,code_c
  22. s:    move.w $dff01c,-(sp)
  23.     move.w #$7fff,$dff09a            ;Turn off all interrupts
  24.     bsr QC_init
  25. loop:    bsr QC_music
  26. loop2:    cmp.b #70,$dff006
  27.     bne loop2
  28. loop3:    cmp.b #70,$dff006
  29.     beq loop3
  30.     btst #6,$bfe001
  31.     bne loop
  32.     bsr QC_end
  33.     move.w (sp)+,d0
  34.     or.w #$8000,d0
  35.     move.w d0,$dff09a
  36.     rts
  37.  
  38. QC_init:lea QC_data,a0        ;Check if the module is ok
  39.     cmp.l #"FORM",(a0)
  40.     bne QC_initerr
  41.     cmp.l #"EMOD",8(a0)
  42.     bne QC_initerr
  43.     cmp.l #"EMIC",12(a0)
  44.     bne QC_initerr
  45.     cmp.w #1,20(a0)
  46.     bne QC_initerr
  47.  
  48.     or.b #$2,$bfe001
  49.     moveq #0,d7        ;Get the adresses to the sampleinfos
  50.     move.b 63(a0),d7    ;and init the real adresses in the infos
  51.     subq #1,d7
  52.     lea 64(a0),a0
  53.     lea QC_samplepointers(pc),a1
  54. QC_sploop:moveq #0,d0
  55.     move.b (a0),d0
  56.     add.w d0,d0
  57.     add.w d0,d0
  58.     move.l a0,(a1,d0.w)
  59.     add.l #QC_data,30(a0)
  60.     move.l 30(a0),a2
  61.     clr.w (a2)
  62.     lea 34(a0),a0
  63.     dbf d7,QC_sploop
  64.  
  65.     lea QC_patternpointers(pc),a1    ;Get the patternadresses
  66.     moveq #0,d7
  67.     addq #1,a0
  68.     move.b (a0)+,d7
  69.     subq #1,d7
  70. QC_pploop:moveq #0,d0
  71.     move.b (a0),d0
  72.     add.w d0,d0
  73.     add.w d0,d0
  74.     move.l a0,(a1,d0.w)
  75.     add.l #QC_data,22(a0)
  76.     lea 26(a0),a0
  77.     dbf d7,QC_pploop
  78.  
  79.     move.l $78,QC_oldirq
  80.     clr.w QC_nrofpos
  81.     move.b (a0)+,QC_nrofpos+1    
  82.     move.l a0,QC_posstart
  83.     moveq #0,d0
  84.     move.b (a0),d0
  85.     add.w d0,d0
  86.     add.w d0,d0
  87.     move.l (a1,d0.w),a1
  88.     move.l 22(a1),QC_currpattpointer    
  89.     move.b 1(a1),QC_breakrow+1
  90.     move.w #6,QC_speed
  91.     move.w QC_speed(pc),QC_speedcount
  92.     clr.b QC_newposflag
  93.     clr.w QC_rowcount
  94.     clr.w QC_pos
  95.     move.w #1,t_length+QC_chan1
  96.     move.w #1,t_length+QC_chan2
  97.     move.w #1,t_length+QC_chan3
  98.     move.w #1,t_length+QC_chan4
  99.     move.w #1,t_replen+QC_chan1
  100.     move.w #1,t_replen+QC_chan2
  101.     move.w #1,t_replen+QC_chan3
  102.     move.w #1,t_replen+QC_chan4
  103.     moveq #0,d0
  104. QC_end:    move.b #$7f,$bfd000+cia_ICR
  105.     move.w #$2000,$dff09a
  106.     move.w #$2000,$dff09c
  107.     move.l QC_oldirq,$78
  108.     move.w #$f,$dff096
  109.     clr.w $dff0a8
  110.     clr.w $dff0b8
  111.     clr.w $dff0c8
  112.     clr.w $dff0d8
  113.     rts        
  114. QC_initerr:moveq #-1,d0
  115.     rts
  116.  
  117. QC_music:
  118.     addq.w #1,QC_speedcount
  119.     move.w QC_speed,d0
  120.     cmp.w QC_speedcount,d0
  121.     bgt QC_nonew
  122.     tst.b QC_pattwait
  123.     beq QC_getnotes
  124.     subq.b #1,QC_pattwait
  125.     clr.w QC_speedcount
  126.  
  127. QC_nonew:lea QC_samplepointers(pc),a4
  128.     lea QC_periodtable(pc),a3
  129.     lea QC_chan1(pc),a6
  130.     lea $dff0a0,a5
  131.     bsr QC_chkplayfx
  132.     lea QC_chan2-QC_chan1(a6),a6
  133.     lea $10(a5),a5
  134.     bsr QC_chkplayfx
  135.     lea QC_chan2-QC_chan1(a6),a6
  136.     lea $10(a5),a5
  137.     bsr QC_chkplayfx
  138.     lea QC_chan2-QC_chan1(a6),a6
  139.     lea $10(a5),a5    
  140.     bsr QC_chkplayfx
  141.  
  142.     move.w QC_dmacon(pc),$dff096
  143.     beq QC_mend
  144.  
  145.     lea $bfd000,a0
  146.     move.b #$7f,cia_ICR(a0)
  147.     move.w #$2000,$dff09c
  148.     move.l #QC_setdma,$78.w
  149.     move.w #$e000,$dff09a
  150.     clr.b cia_CRA(a0)
  151.     move.b #QC_dmawait,cia_TALO(a0)
  152.     clr.b cia_TAHI(a0)
  153.     move.b #$11,cia_CRA(a0)
  154.     move.b #$81,cia_ICR(a0)
  155.     rts    
  156.  
  157. QC_chkplayfx:
  158.     lea QC_playfx(pc),a2
  159.     move.b t_cmd(a6),d0
  160.     and.w #$f,d0
  161.     add.w d0,d0    
  162.     add.w d0,d0    
  163.     move.l (a2,d0.w),a0
  164.     jmp (a0)    
  165.     
  166. QC_getnotes:
  167.     clr.w QC_speedcount
  168.     move.l QC_currpattpointer(pc),a0
  169.     move.w QC_rowcount(pc),d0
  170.     asl.w #4,d0
  171.     add.w d0,a0
  172.     lea QC_samplepointers(pc),a4
  173.     lea QC_periods(pc),a3
  174.     
  175.     lea $dff0a0,a5
  176.     lea QC_chan1(pc),a6
  177.     bsr QC_playnote
  178.     lea $10(a5),a5
  179.     lea QC_chan2-QC_chan1(a6),a6
  180.     bsr QC_playnote
  181.     lea $10(a5),a5
  182.     lea QC_chan2-QC_chan1(a6),a6
  183.     bsr QC_playnote
  184.     lea $10(a5),a5
  185.     lea QC_chan2-QC_chan1(a6),a6
  186.     bsr QC_playnote
  187.  
  188.     move.w QC_dmacon(pc),$dff096
  189.     beq QC_update
  190.  
  191.     lea $bfd000,a0
  192.     move.b #$7f,cia_ICR(a0)
  193.     move.w #$2000,$dff09c
  194.     move.w #$e000,$dff09a
  195.     move.l #QC_setdma,$78.w
  196.     clr.b cia_CRA(a0)
  197.     move.b #QC_dmawait,cia_TALO(a0)
  198.     clr.b cia_TAHI(a0)
  199.     move.b #$11,cia_CRA(a0)
  200.     move.b #$81,cia_ICR(a0)
  201.     
  202. QC_update:
  203. QC_tstnewpos:tst.b QC_newposflag
  204.     beq QC_tstend
  205.     clr.b QC_newposflag
  206.     move.w QC_newposnr,QC_pos
  207.     bra QC_newpos
  208. QC_tstend:tst.b QC_jumpbreakflag
  209.     beq QC_tstend2
  210.     clr.b QC_jumpbreakflag
  211.     move.w QC_looprow(pc),d0
  212.     cmp.w QC_breakrow(pc),d0
  213.     bgt QC_mend
  214.     move.w d0,QC_rowcount
  215.     rts
  216. QC_tstend2:    
  217.     addq.w #1,QC_rowcount
  218.     move.w QC_rowcount(pc),d0
  219.     cmp.w QC_breakrow(pc),d0
  220.     ble QC_mend
  221.     addq.w #1,QC_pos
  222. QC_newpos:move.w QC_pos(pc),d0
  223.     cmp.w QC_nrofpos(pc),d0
  224.     blt QC_getpos
  225.     clr.w QC_pos
  226.     moveq #0,d0
  227. QC_getpos:move.l QC_posstart(pc),a0
  228.     move.b (a0,d0.w),d0
  229.     add.w d0,d0
  230.     add.w d0,d0
  231.     lea QC_patternpointers(pc),a0
  232.     move.l (a0,d0.w),a0
  233.     move.l 22(a0),QC_currpattpointer
  234.     move.b 1(a0),QC_breakrow+1
  235.     move.w QC_newrow(pc),QC_rowcount
  236.     clr.w QC_newrow
  237.     move.w QC_breakrow,d0
  238.     cmp.w QC_rowcount,d0
  239.     bge QC_mend
  240.     move.w d0,QC_rowcount
  241. QC_mend:rts
  242.  
  243. QC_setdma:
  244.     tst.b $bfd000+cia_ICR
  245.     or.w #$8000,QC_dmacon
  246.     move.w QC_dmacon(pc),$dff096
  247.     clr.w QC_dmacon
  248.     move.l #QC_fixloop,$78.w
  249.     move.w #$2000,$dff09c
  250.     rte
  251.  
  252. QC_fixloop:    
  253.     tst.b $bfd000+cia_ICR
  254.     move.l a5,-(sp)
  255.     move.l a0,-(sp)
  256.     lea $dff000,a5
  257.     lea QC_chan1+t_repeat(pc),a0
  258.     move.l (a0),$a0(a5)    
  259.     move.w 4(a0),$a4(a5)
  260.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  261.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  262.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  263.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  264.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  265.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  266.     clr.b $bfd000+cia_CRA
  267.     move.b #$7f,$bfd000+cia_ICR
  268.     move.w #$2000,$dff09a
  269.     move.w #$2000,$dff09c
  270.     move.l (sp)+,a0
  271.     move.l (sp)+,a5
  272.     rte    
  273.     
  274. QC_playnote:move.l (a0)+,(a6)
  275.     moveq #0,d0
  276.     move.b (a6),d0
  277.     beq QC_isnote
  278.     add.w d0,d0
  279.     add.w d0,d0
  280.     move.l (a4,d0.w),a1
  281.     move.b 1(a1),t_volume+1(a6)
  282.     move.b 25(a1),d0
  283.     and.w #$f,d0
  284.     add.w d0,d0
  285.     add.w d0,d0
  286.     move.l (a3,d0.w),t_finetune(a6)
  287.     move.l 30(a1),d1
  288.     move.l d1,t_start(a6)
  289.     move.w t_volume(a6),8(a5)
  290.     btst #0,24(a1)
  291.     beq QC_noloop
  292.     moveq #0,d0
  293.     move.w 26(a1),d0
  294.     add.l d0,d1
  295.     add.l d0,d1
  296.     move.l d1,t_repeat(a6)
  297.     moveq #0,d0
  298.     move.w 26(a1),d0
  299.     moveq #0,d1
  300.     move.w 28(a1),d1
  301.     add.l d0,d1
  302.     move.w d1,t_length(a6)
  303.     move.w 28(a1),t_replen(a6)
  304.     bra QC_isnote
  305. QC_noloop:clr.l t_repeat(a6)
  306.     move.w #$1,t_replen(a6)
  307.     move.w 2(a1),t_length(a6)
  308. QC_isnote:
  309.     tst.b t_notenr(a6)
  310.     blt QC_chkfirstfx
  311.     move.b t_notenr(a6),t_notenr2+1(a6)
  312.     move.w t_cmd(a6),d0
  313.     and.w #$ff0,d0
  314.     cmp.w #$e50,d0
  315.     beq QC_setfinetunefirst
  316.     and.w #$f00,d0
  317.     cmp.w #$300,d0
  318.     beq QC_settoneport
  319.     cmp.w #$500,d0
  320.     beq QC_settoneport
  321. QC_getper:move.w t_notenr2(a6),d0
  322.     add.w d0,d0
  323.     move.l t_finetune(a6),a2
  324.     move.w (a2,d0.w),t_period(a6)
  325.     move.w t_cmd(a6),d0
  326.     and.w #$ff0,d0
  327.     cmp.w #$ed0,d0
  328.     beq QC_notedelay
  329.     move.w t_dmabit(a6),d0
  330.     or.w d0,QC_dmacon
  331.     move.l t_start(a6),(a5)
  332.     move.w t_length(a6),4(a5)
  333.     move.w t_period(a6),6(a5)
  334. QC_chkfirstfx:
  335.     lea QC_fxaftersetperiod(pc),a2
  336.     moveq #0,d0
  337.     move.b t_cmd(a6),d0
  338.     add.w d0,d0
  339.     add.w d0,d0
  340.     move.l (a2,d0.w),a2
  341.     jmp (a2)
  342.  
  343.  
  344. QC_setfinetunefirst:
  345.     moveq #0,d0
  346.     move.b t_cmdarg(a6),d0
  347.     add.w d0,d0
  348.     add.w d0,d0
  349.     move.l (a3,d0.w),t_finetune(a6)
  350.     bra QC_getper
  351.             
  352. QC_ecommands:
  353.     lea QC_efx(pc),a2
  354.     move.b t_cmdarg(a6),d0
  355.     and.w #$f0,d0
  356.     lsr.w #2,d0
  357.     move.l (a2,d0.w),a2
  358.     jmp (a2) 
  359.  
  360. QC_playecommands:
  361.     lea QC_playefx(pc),a2
  362.     move.b t_cmdarg(a6),d0
  363.     and.w #$f0,d0
  364.     lsr.w #2,d0
  365.     move.l (a2,d0.w),a2
  366.     jmp (a2) 
  367.  
  368. ********** Effect commands **********
  369.  
  370. QC_arpeggio:
  371.     tst.b t_cmdarg(a6)
  372.     beq QC_mend
  373.     move.w QC_speedcount,d0
  374.     lea QC_arptbl,a2
  375.     tst.b (a2,d0.w)
  376.     beq QC_arp2
  377.     blt QC_arp1
  378.     move.b t_cmdarg(a6),d0
  379.     and.w #$f,d0
  380.     add.w t_notenr2(a6),d0
  381.     add.w d0,d0
  382.     move.l t_finetune(a6),a2    
  383.     move.w (a2,d0.w),6(a5)    
  384.     rts
  385. QC_arp1:move.w t_period(a6),6(a5)
  386.     rts
  387. QC_arp2:moveq #0,d0
  388.     move.b t_cmdarg(a6),d0
  389.     lsr.w #4,d0
  390.     add.w t_notenr2(a6),d0
  391.     add.w d0,d0    
  392.     move.l t_finetune(a6),a2
  393.     move.w (a2,d0.w),6(a5)    
  394.     rts
  395.  
  396. QC_slideup:
  397.     moveq #0,d0            
  398.     move.b t_cmdarg(a6),d0        
  399.     sub.w d0,t_period(a6)        
  400.     cmp.w #113,t_period(a6)        
  401.     bgt QC_sunotlow
  402.     move.w #113,t_period(a6)
  403. QC_sunotlow:
  404.     move.w t_period(a6),6(a5)
  405.     rts    
  406.  
  407. QC_slidedown:
  408.     moveq #0,d0
  409.     move.b t_cmdarg(a6),d0
  410.     add.w d0,t_period(a6)
  411.     cmp.w #856,t_period(a6)
  412.     blt QC_sdnothigh
  413.     move.w #856,t_period(a6)
  414. QC_sdnothigh:
  415.     move.w t_period(a6),6(a5)
  416.     rts    
  417.  
  418. QC_settoneport:
  419.     move.w t_notenr2(a6),d0
  420.     add.w d0,d0
  421.     move.l t_finetune(a6),a2
  422.     move.w (a2,d0.w),d0
  423.     move.w d0,t_wantedperiod(a6)
  424.     cmp.w t_period(a6),d0    
  425.     bgt QC_setportdown
  426.     clr.b t_portdir(a6)
  427.     rts
  428. QC_setportdown:
  429.     move.b #1,t_portdir(a6)
  430.     rts    
  431.  
  432. QC_toneport:
  433.     tst.w t_wantedperiod(a6)
  434.     beq QC_mend
  435.     moveq #0,d0
  436.     move.b t_cmdarg(a6),d0
  437.     beq QC_tpold
  438.     move.b d0,t_portspeed(a6)
  439.     tst.b t_portdir(a6)
  440.     bne QC_portdown
  441.     sub.w d0,t_period(a6)
  442.     move.w t_wantedperiod(a6),d0
  443.     cmp.w t_period(a6),d0
  444.     blt QC_notyetwanted
  445.     move.w d0,6(a5)
  446.     move.w d0,t_period(a6)
  447.     clr.w t_wantedperiod(a6)
  448.     rts
  449. QC_tpold:move.b t_portspeed(a6),d0
  450.     tst.b t_portdir(a6)
  451.     bne QC_portdown
  452.     sub.w d0,t_period(a6)
  453.     move.w t_wantedperiod(a6),d0
  454.     cmp.w t_period(a6),d0
  455.     blt QC_notyetwanted
  456.     move.w d0,6(a5)
  457.     move.w d0,t_period(a6)
  458.     clr.w t_wantedperiod(a6)
  459.     rts
  460. QC_portdown:
  461.     add.w d0,t_period(a6)
  462.     move.w t_wantedperiod(a6),d0
  463.     cmp.w t_period(a6),d0
  464.     bgt QC_notyetwanted
  465.     move.w d0,6(a5)
  466.     move.w d0,t_period(a6)
  467.     clr.w t_wantedperiod(a6)
  468.     rts
  469. QC_notyetwanted:
  470.     tst.b t_glisscont(a6)
  471.     beq QC_nogliss
  472.     move.l t_finetune(a6),a2
  473.     move.w t_period(a6),d0
  474. QC_glissloop:
  475.     cmp.w (a2)+,d0
  476.     blt QC_glissloop
  477.     move.w -2(a2),6(a5)
  478.     rts
  479. QC_nogliss:
  480.     move.w t_period(a6),6(a5)
  481.     rts
  482.     
  483. QC_vibrato:
  484.     moveq #0,d0
  485.     move.b t_vibwave(a6),d0
  486.     asl.w #7,d0
  487.     lea QC_vibtables(pc),a2
  488.     add.w d0,a2
  489.     moveq #0,d0
  490.     move.b t_cmdarg(a6),d0
  491.     beq QC_vib    
  492.     move.w d0,d1
  493.     and.b #$f,d0
  494.     beq QC_vibusespeed
  495.     and.b #$f0,t_vibcmd(a6)
  496.     or.b d0,t_vibcmd(a6)
  497. QC_vibusespeed:
  498.     and.b #$f0,d1
  499.     beq QC_vib
  500.     and.b #$f,t_vibcmd(a6)
  501.     or.b d1,t_vibcmd(a6)
  502. QC_vib:    move.b t_vibcmd(a6),d0
  503.     lsr.w #3,d0
  504.     add.w d0,t_vibpos(a6)
  505.     and.w #$7e,t_vibpos(a6)
  506.     move.w t_vibpos(a6),d0
  507.     move.w t_period(a6),d1
  508.     move.w (a2,d0.w),d0
  509.     move.b t_vibcmd(a6),d2
  510.     and.w #$f,d2
  511.     muls d2,d0
  512.     add.l d0,d0
  513.     add.l d0,d0
  514.     swap d0
  515.     add.w d0,d1
  516.     cmp.w #856,d1
  517.     blt QC_vibnothigh
  518.     move.w #856,d1
  519. QC_vibnothigh:
  520.     cmp.w #113,d1
  521.     bgt QC_vibnotlow
  522.     moveq #113,d1
  523. QC_vibnotlow:
  524.     move.w d1,6(a5)
  525.     rts    
  526.  
  527. QC_toneportandvolslide:
  528.     tst.w t_wantedperiod(a6)
  529.     beq QC_volslide
  530.     bsr QC_tpold
  531.     bra QC_volslide
  532.  
  533. QC_vibratoandvolslide:
  534.     bsr QC_vib
  535.     bra QC_volslide
  536.  
  537. QC_tremolo:
  538.     moveq #0,d0
  539.     move.b t_tremwave(a6),d0
  540.     asl.w #7,d0
  541.     lea QC_vibtables(pc),a2
  542.     add.w d0,a2
  543.     moveq #0,d0
  544.     move.b t_cmdarg(a6),d0
  545.     beq QC_trem    
  546.     move.w d0,d1
  547.     and.b #$f,d0
  548.     beq QC_tremusespeed
  549.     and.b #$f0,t_tremcmd(a6)
  550.     or.b d0,t_tremcmd(a6)
  551. QC_tremusespeed:
  552.     and.b #$f0,d1
  553.     beq QC_trem
  554.     and.b #$f,t_tremcmd(a6)
  555.     or.b d1,t_tremcmd(a6)
  556. QC_trem:move.b t_tremcmd(a6),d0
  557.     lsr.w #3,d0
  558.     add.w d0,t_trempos(a6)
  559.     and.w #$7e,t_trempos(a6)
  560.     move.w t_trempos(a6),d0
  561.     move.w t_volume(a6),d1
  562.     move.w (a2,d0.w),d0
  563.     move.b t_tremcmd(a6),d2
  564.     and.w #$f,d2
  565.     muls d2,d0
  566.     asl.l #3,d0
  567.     swap d0
  568.     add.w d0,d1
  569.     cmp.w #40,d1
  570.     blt QC_tremnothigh
  571.     move.w #40,d1
  572. QC_tremnothigh:
  573.     tst.w d1
  574.     bgt QC_tremnotlow
  575.     moveq #0,d1
  576. QC_tremnotlow:
  577.     move.w d1,8(a5)
  578.     rts    
  579.  
  580. QC_sampleoffset:
  581.     moveq #0,d0
  582.     move.b t_cmdarg(a6),d0
  583.     beq QC_sook
  584.     move.b d0,t_sampleoffset(a6)
  585. QC_sook:move.b t_sampleoffset(a6),d0
  586.     asl.w #8,d0
  587.     moveq #0,d1
  588.     move.w t_length(a6),d1
  589.     sub.l d0,d1
  590.     ble QC_sotoolong
  591.     move.w d1,t_length(a6)
  592.     add.l d0,d0
  593.     add.l d0,t_start(a6)
  594.     move.l t_start(a6),(a5)
  595.     move.w t_length(a6),4(a5)
  596.     rts
  597. QC_sotoolong:
  598.     move.w #1,t_length(a6)
  599.     move.w t_length(a6),4(a5)
  600.     rts
  601.     
  602. QC_volslide:
  603.     moveq #0,d0
  604.     move.b t_cmdarg(a6),d0
  605.     lsr.w #4,d0
  606.     beq QC_volslidedown
  607.     add.w d0,t_volume(a6)
  608.     cmp.w #$40,t_volume(a6)    
  609.     blt QC_setvol
  610.     move.w #$40,t_volume(a6)
  611. QC_setvol:move.w t_volume(a6),8(a5)
  612.     rts
  613. QC_volslidedown:
  614.     move.b t_cmdarg(a6),d0
  615.     sub.w d0,t_volume(a6)
  616.     tst.w t_volume(a6)    
  617.     bgt QC_setvol
  618.     clr.w t_volume(a6)
  619.     clr.w 8(a5)
  620.     rts        
  621.  
  622. QC_posjump:
  623.     move.b t_cmdarg(a6),QC_newposnr+1
  624.     move.b #1,QC_newposflag
  625.     clr.w QC_newrow
  626.     rts
  627.  
  628. QC_volumechange:
  629.     move.b t_cmdarg(a6),d0
  630.     cmp.b #$40,d0
  631.     blo QC_volchhigh
  632.     move.w #$40,t_volume(a6)
  633.     move.w #$40,8(a5)
  634.     rts
  635. QC_volchhigh:
  636.     move.b d0,t_volume+1(a6)
  637.     move.w t_volume(a6),8(a5)
  638.     rts
  639.  
  640. QC_patternbreak:
  641.     move.w QC_pos,d0
  642.     addq.w #1,d0
  643.     move.w d0,QC_newposnr
  644.     move.b t_cmdarg(a6),QC_newrow+1
  645.     move.b #1,QC_newposflag
  646.     rts
  647.  
  648. QC_setspeed:
  649.     move.b t_cmdarg(a6),d0
  650.     beq QC_setspeed1
  651.     cmp.b #$1f,d0
  652.     bhi QC_end
  653.     move.b d0,QC_speed+1
  654.     clr.w QC_speedcount
  655.     rts
  656. QC_setspeed1:
  657.     move.w #1,QC_speed
  658.     clr.w QC_speedcount
  659.     rts
  660.  
  661. QC_setfilter:
  662.     move.b t_cmdarg(a6),d0
  663.     and.b #1,d0
  664.     add.b d0,d0
  665.     and.b #$fd,$bfe001
  666.     or.b d0,$bfe001
  667.     rts
  668.  
  669. QC_fineslideup:
  670.     move.b t_cmdarg(a6),d0
  671.     and.w #$f,d0
  672.     sub.w d0,t_period(a6)
  673.     cmp.w #113,t_period(a6)
  674.     bgt QC_fsunotlow
  675.     move.w #113,t_period(a6)
  676. QC_fsunotlow:
  677.     move.w t_period(a6),6(a5)
  678.     rts
  679.  
  680. QC_fineslidedown:
  681.     move.b t_cmdarg(a6),d0
  682.     and.w #$f,d0
  683.     add.w d0,t_period(a6)
  684.     cmp.w #856,t_period(a6)
  685.     blt QC_fsdnothigh
  686.     move.w #856,t_period(a6)
  687. QC_fsdnothigh:
  688.     move.w t_period(a6),6(a5)
  689.     rts    
  690.     
  691. QC_glisscontrol:
  692.     move.b t_cmdarg(a6),t_glisscont(a6)
  693.     and.b #$f,t_glisscont(a6)
  694.     rts
  695.  
  696. QC_vibratowave:
  697.     move.b t_cmdarg(a6),t_vibwave(a6)
  698.     and.b #$f,t_vibwave(a6)
  699.     rts
  700.  
  701. QC_finetune:
  702.     move.b t_cmdarg(a6),d0
  703.     and.w #$f,d0
  704.     add.w d0,d0
  705.     add.w d0,d0
  706.     move.l (a3,d0.w),t_finetune(a6)
  707.     rts
  708.     
  709. QC_jumploop:
  710.     move.b t_cmdarg(a6),d0
  711.     and.w #$f,d0
  712.     beq QC_saveloop
  713.     tst.b QC_loopcount
  714.     beq QC_saveloop
  715.     subq.b #1,QC_loopcount
  716.     beq QC_mend
  717.     move.b #1,QC_jumpbreakflag
  718.     rts    
  719. QC_newloop:
  720.     move.b d0,QC_loopcount
  721.     move.b #1,QC_jumpbreakflag
  722.     rts    
  723. QC_saveloop:
  724.     move.w QC_rowcount(pc),QC_looprow
  725.     rts
  726.  
  727. QC_tremolowave:
  728.     move.b t_cmdarg(a6),t_tremwave(a6)
  729.     and.b #$f,t_tremwave(a6)
  730.     rts
  731.  
  732. QC_initretrig:
  733.     clr.b t_retrig(a6)
  734. QC_retrignote:
  735.     addq.b #1,t_retrig(a6)
  736.     move.b t_cmdarg(a6),d0
  737.     and.b #$f,d0
  738.     cmp.b t_retrig(a6),d0
  739.     bgt QC_mend
  740.     clr.b t_retrig(a6)
  741.     move.w t_dmabit(a6),d0
  742.     or.w d0,QC_dmacon
  743.     move.l t_start(a6),(a5)
  744.     move.w t_length(a6),4(a5)
  745.     move.w t_period(a6),6(a5)
  746.     rts
  747.  
  748. QC_volumefineup:
  749.     move.b t_cmdarg(a6),d0
  750.     and.w #$f,d0
  751.     add.w d0,t_volume(a6)
  752.     cmp.w #$40,t_volume(a6)
  753.     blt QC_vfuset
  754.     move.w #$40,t_volume(a6)
  755.     move.w #$40,8(a5)
  756.     rts
  757. QC_vfuset:move.w t_volume(a6),8(a5)
  758.     rts    
  759.  
  760. QC_volumefinedown:
  761.     move.b t_cmdarg(a6),d0
  762.     and.w #$f,d0
  763.     sub.w d0,t_volume(a6)
  764.     bge QC_vfdset
  765.     clr.w t_volume(a6)
  766.     clr.w 8(a5)
  767.     rts
  768. QC_vfdset:move.w t_volume(a6),8(a5)
  769.     rts    
  770.  
  771. QC_notecut:
  772.     moveq #0,d1
  773.     move.b t_cmdarg(a6),d1
  774.     and.b #$f,d1
  775.     cmp.w QC_speedcount(pc),d1
  776.     bgt QC_mend
  777.     clr.w t_volume(a6)
  778.     clr.w 8(a5)
  779.     rts
  780.  
  781. QC_notedelay:
  782.     moveq #0,d1
  783.     move.b t_cmdarg(a6),d1
  784.     and.b #$f,d1
  785.     cmp.w QC_speedcount(pc),d1
  786.     bne QC_mend
  787.     move.w t_dmabit(a6),d0
  788.     or.w d0,QC_dmacon
  789.     move.l t_start(a6),(a5)
  790.     move.w t_length(a6),4(a5)
  791.     move.w t_period(a6),6(a5)
  792.     rts
  793.  
  794. QC_patterndelay:
  795.     move.b t_cmdarg(a6),QC_pattwait
  796.     and.b #$f,QC_pattwait
  797.     rts
  798.  
  799. QC_arptbl:rept 86        ;if your assembler doensn't want to handle
  800.     dc.b -1,0,1        ;the "rept" command, you'll have to write
  801.     endr            ;a list incl. 256 numbers like this:
  802.                 ;-1,0,1,-1,0,1,-1.. and so on.
  803.  
  804.  
  805. QC_playfx:dc.l QC_arpeggio
  806.     dc.l QC_slideup
  807.     dc.l QC_slidedown
  808.     dc.l QC_toneport
  809.     dc.l QC_vibrato
  810.     dc.l QC_toneportandvolslide
  811.     dc.l QC_vibratoandvolslide
  812.     dc.l QC_tremolo
  813.     dc.l QC_mend
  814.     dc.l QC_mend
  815.     dc.l QC_volslide
  816.     dc.l QC_mend
  817.     dc.l QC_mend
  818.     dc.l QC_mend
  819.     dc.l QC_playecommands    
  820.     dc.l QC_mend
  821.  
  822. QC_playefx:dc.l QC_mend
  823.     dc.l QC_mend
  824.     dc.l QC_mend
  825.     dc.l QC_mend
  826.     dc.l QC_mend
  827.     dc.l QC_mend
  828.     dc.l QC_mend
  829.     dc.l QC_mend
  830.     dc.l QC_mend
  831.     dc.l QC_retrignote
  832.     dc.l QC_mend
  833.     dc.l QC_mend
  834.     dc.l QC_notecut
  835.     dc.l QC_notedelay
  836.     dc.l QC_mend
  837.     dc.l QC_mend
  838.  
  839. QC_efx:    dc.l QC_setfilter
  840.     dc.l QC_fineslideup
  841.     dc.l QC_fineslidedown
  842.     dc.l QC_glisscontrol
  843.     dc.l QC_vibratowave
  844.     dc.l QC_finetune
  845.     dc.l QC_jumploop
  846.     dc.l QC_tremolowave
  847.     dc.l QC_mend
  848.     dc.l QC_initretrig
  849.     dc.l QC_volumefineup
  850.     dc.l QC_volumefinedown
  851.     dc.l QC_notecut
  852.     dc.l QC_notedelay
  853.     dc.l QC_patterndelay
  854.     dc.l QC_mend
  855.     
  856.  
  857. QC_fxaftersetperiod:
  858.     dc.l QC_arpeggio
  859.     dc.l QC_mend
  860.     dc.l QC_mend
  861.     dc.l QC_mend
  862.     dc.l QC_mend
  863.     dc.l QC_mend
  864.     dc.l QC_mend
  865.     dc.l QC_mend
  866.     dc.l QC_mend
  867.     dc.l QC_sampleoffset
  868.     dc.l QC_mend
  869.     dc.l QC_posjump
  870.     dc.l QC_volumechange
  871.     dc.l QC_patternbreak
  872.     dc.l QC_ecommands
  873.     dc.l QC_setspeed        
  874.  
  875.  
  876. QC_vibtables:
  877.     dc.w 0,3211,6392,9511,12539,15446,18204,20787,23169,25329
  878.     dc.w 27244,28897,30272,31356,32137,32609,32767,32609,32137
  879.     dc.w 31356,30272,28897,27244,25329,23169,20787,18204,15446
  880.     dc.w 12539,9511,6392,3211
  881.     dc.w 0,-3211,-6392,-9511,-12539,-15446,-18204,-20787,-23169,-25329
  882.     dc.w -27244,-28897,-30272,-31356,-32137,-32609,-32767,-32609,-32137
  883.     dc.w -31356,-30272,-28897,-27244,-25329,-23169,-20787,-18204,-15446
  884.     dc.w -12539,-9511,-6392,-3211
  885.  
  886.     dc.w 32767,31744,30720,29696,28672,27648,26624,25600,24576,23552
  887.     dc.w 22528,21504,20480,19456,18432,17408,16384,15360,14336,13312
  888.     dc.w 12288,11264,10240,9216,8192,7168,6144,5120,4096,3072,2048,1024
  889.     dc.w 0,-1024,-2048,-3072,-4096,-5120,-6144,-8168,-8192,-9216,-10240
  890.     dc.w -11264,-12288,-13312,-14336,-15360,-16384,-17408,-18432,-19456
  891.     dc.w -20480,-21504,-22528,-23552,-24576,-25600,-26624,-27648,-28672
  892.     dc.w -29696,-30720,-31744,-32768
  893.  
  894.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  895.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  896.     dc.w 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767
  897.     dc.w 32767,32767
  898.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  899.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  900.     dc.w -32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767
  901.     dc.w -32767,-32767
  902.     
  903.  
  904.  
  905.  
  906. QC_periods:dc.l QC_periodtable
  907.     dc.l QC_periodtable+72
  908.     dc.l QC_periodtable+144
  909.     dc.l QC_periodtable+216
  910.     dc.l QC_periodtable+288
  911.     dc.l QC_periodtable+360
  912.     dc.l QC_periodtable+432
  913.     dc.l QC_periodtable+504
  914.     dc.l QC_periodtable+576
  915.     dc.l QC_periodtable+648
  916.     dc.l QC_periodtable+720
  917.     dc.l QC_periodtable+792
  918.     dc.l QC_periodtable+864
  919.     dc.l QC_periodtable+936
  920.     dc.l QC_periodtable+1008
  921.     dc.l QC_periodtable+1080
  922.  
  923.  
  924. QC_periodtable:
  925.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  926.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  927.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  928.  
  929.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  930.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  931.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  932.  
  933.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  934.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  935.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  936.  
  937.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  938.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  939.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  940.  
  941.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  942.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  943.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  944.  
  945.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  946.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  947.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  948.  
  949.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  950.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  951.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  952.  
  953.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  954.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  955.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  956.  
  957.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  958.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  959.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  960.  
  961.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  962.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  963.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  964.  
  965.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  966.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  967.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  968.  
  969.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  970.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  971.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  972.  
  973.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  974.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  975.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  976.  
  977.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  978.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  979.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  980.  
  981.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  982.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  983.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  984.  
  985.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  986.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  987.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  988.  
  989.  
  990. QC_samplepointers:
  991.     blk.l 256,QC_quietsamp    
  992. QC_patternpointers:
  993.     blk.l 256,0
  994. QC_currpattpointer:dc.l 0
  995. QC_posstart:dc.l 0
  996. QC_nrofpos:dc.w 0
  997. QC_pos:    dc.w 0
  998. QC_speed:dc.w 6
  999. QC_speedcount:dc.w 0
  1000. QC_breakrow:dc.w 0
  1001. QC_newrow:dc.w 0
  1002. QC_newposnr:dc.w 0
  1003. QC_rowcount:dc.w 0
  1004. QC_quiet:dc.w 0
  1005. QC_dmacon:dc.w 0
  1006. QC_looprow:dc.w 0
  1007. QC_tempo:dc.w 125
  1008. QC_oldirq:dc.l 0
  1009. QC_newposflag:dc.b 0
  1010. QC_jumpbreakflag:dc.b 0
  1011. QC_loopcount:dc.b 0
  1012. QC_pattwait:dc.b 0
  1013.  
  1014. QC_quietsamp:
  1015.     dc.w 0,1
  1016.     blk.b 20
  1017.     dc.w 0
  1018.     dc.w 1
  1019.     dc.l QC_quiet
  1020.  
  1021.  
  1022.  
  1023. t_notenr = 1
  1024. t_cmd = 2
  1025. t_cmdarg = 3
  1026. t_repeat = 4
  1027. t_replen = 8
  1028. t_period = 10
  1029. t_volume = 12
  1030. t_length = 14
  1031. t_finetune = 42
  1032. t_start = 18
  1033. t_dmabit = 22
  1034. t_notenr2 = 24
  1035. t_wantedperiod = 26
  1036. t_portdir = 28
  1037. t_vibwave = 29
  1038. t_glisscont = 30
  1039. t_vibcmd = 31
  1040. t_vibpos = 32
  1041. t_tremwave = 34
  1042. t_tremcmd = 35
  1043. t_trempos = 36
  1044. t_sampleoffset = 38
  1045. t_retrig = 39
  1046. t_portspeed = 40
  1047.     even
  1048. QC_chan1:dc.l 0            ;The note and command
  1049.     dc.l 0            ;Repeat
  1050.     dc.w 0            ;Replen
  1051.     dc.w 0            ;Period
  1052.     dc.w 0            ;Volume
  1053.     dc.w 0            ;Length
  1054.     dc.w 0            ;Finetune
  1055.     dc.l 0            ;Start
  1056.     dc.w 1            ;DMAbit
  1057.     dc.w 0            ;NoteNr2
  1058.     dc.w 0            ;WantedPeriod
  1059.     dc.b 0            ;Portdir
  1060.     dc.b 0            ;VibWave
  1061.     dc.b 0            ;Glisscont
  1062.     dc.b 0            ;Vibcmd
  1063.     dc.w 0            ;VibPos
  1064.     dc.b 0            ;Tremwave
  1065.     dc.b 0            ;Tremcmd
  1066.     dc.w 0            ;Trempos
  1067.     dc.b 0            ;Sampleoffset
  1068.     dc.b 0            ;Retrig
  1069.     dc.b 0            ;Portspeed
  1070.     dc.b 0            ;
  1071.     dc.l 0            ;FineTune
  1072.  
  1073.     even
  1074. QC_chan2:dc.l 0
  1075.     dc.l 0
  1076.     dc.w 0
  1077.     dc.w 0
  1078.     dc.w 0
  1079.     dc.w 0
  1080.     dc.w 0
  1081.     dc.l 0
  1082.     dc.w 2
  1083.     dc.w 0
  1084.     dc.w 0
  1085.     dc.b 0
  1086.     dc.b 0
  1087.     dc.b 0
  1088.     dc.b 0
  1089.     dc.w 0
  1090.     dc.b 0
  1091.     dc.b 0
  1092.     dc.w 0
  1093.     dc.b 0
  1094.     dc.b 0
  1095.     dc.b 0
  1096.     dc.b 0
  1097.     dc.l 0
  1098.  
  1099.     even
  1100. QC_chan3:dc.l 0
  1101.     dc.l 0
  1102.     dc.w 0
  1103.     dc.w 0
  1104.     dc.w 0
  1105.     dc.w 0
  1106.     dc.w 0
  1107.     dc.l 0
  1108.     dc.w 4
  1109.     dc.w 0
  1110.     dc.w 0
  1111.     dc.b 0
  1112.     dc.b 0
  1113.     dc.b 0
  1114.     dc.b 0
  1115.     dc.w 0
  1116.     dc.b 0
  1117.     dc.b 0
  1118.     dc.w 0
  1119.     dc.b 0
  1120.     dc.b 0
  1121.     dc.b 0
  1122.     dc.b 0
  1123.     dc.l 0
  1124.  
  1125.     even
  1126. QC_chan4:dc.l 0
  1127.     dc.l 0
  1128.     dc.w 0
  1129.     dc.w 0
  1130.     dc.w 0
  1131.     dc.w 0
  1132.     dc.w 0
  1133.     dc.l 0
  1134.     dc.w 8
  1135.     dc.w 0
  1136.     dc.w 0
  1137.     dc.b 0
  1138.     dc.b 0
  1139.     dc.b 0
  1140.     dc.b 0
  1141.     dc.w 0
  1142.     dc.b 0
  1143.     dc.b 0
  1144.     dc.w 0
  1145.     dc.b 0
  1146.     dc.b 0
  1147.     dc.b 0
  1148.     dc.b 0
  1149.     dc.l 0
  1150.  
  1151.     even
  1152. QC_data:            ;Your module here!
  1153.  
  1154.